/*
 * @Descripttion: qiankun2注册微应用
 * @version:
 * @Author: zhaoxiaodong
 * @Date: 2020-08-14 10:13:43
 * @LastEditors  : 彭浩
 * @LastEditTime : 2021-01-27 17:54:43
 */

import {
    registerMicroApps,
    runAfterFirstMounted,
    setDefaultMountApp,
    addGlobalUncaughtErrorHandler,
    start,
    initGlobalState,
} from "qiankun";

import store from "../store";

/**
 * @description 添加全局的未捕获异常处理器
 */
// addGlobalUncaughtErrorHandler(event => {
//     console.error(event);
//     const { message: msg } = event;
//     // 加载失败时提示
//     if (msg && msg.includes("died in status LOADING_SOURCE_CODE")) {
//         $cloudMessage.error("微应用加载失败，请检查应用是否可运行");
//     }
// });
/**
 * @description 导入想传递给子应用的方法，其他类型的数据皆可按此方式传递
 * @description 提供子应用调用主应用方法的途径
 */
import emits from "../utils/emit";
/**
 * @description 导入qiankun应用间通信机制appStore
 */
import appStore from "../utils/app-store";

/**
 * @description 导入全局常量给子应用
 */
import GLOBAL from "../utils/global";

/**
 * @description 声明子应用挂载的dom节点；
 */
const appContainer = "#subapp-view";

/**
 * @description 声明要传递给子应用的信息
 * @param data 主应要传递给子应用的数据类信息
 * @param emits 主应要传递给子应用的方法类信息
 * @param GLOBAL 主应要传递给子应用的全局常量
 */
let props = {
    data: store.getters,
    emits,
    GLOBAL,
};
/**
 * 路由监听
 * @param {String} routerPrefix 路由前缀
 */
function genActiveRule(routerPrefix) {
    return location => location.pathname.startsWith(routerPrefix);
  }
/**
 * @description 启用qiankun微前端应用
 * @param {Array} list 应用注册表信息
 */
const qianKunStart = list => {
    /**
     * @description 处理子应用注册表数据
     */
    let apps = []; // 子应用数组盒子
    let defaultApp = null; // 默认注册应用路由前缀
    let isDev = process.env.NODE_ENV === "development"; // 根据开发环境|线上环境加载不同entry
    list.forEach(i => {
        apps.push({
            name: i.module,
            entry: isDev ? i.devEntry : i.proEntry,
            container: appContainer,
            activeRule: i.activeRule,
            props: { ...props, routes: i.data, routerBase: i.activeRule },
        });
        if (i.defaultRegister) defaultApp = i.activeRule;
    });

    /**
     * @description 注册子应用
     * @param {Array} list subApps
     */
    registerMicroApps(apps, {
        beforeLoad: [
            app => {
                console.log(
                    "[LifeCycle] before load %c%s",
                    "color: green;",
                    app.name
                );
            },
        ],
        beforeMount: [
            app => {
                console.log(
                    "[LifeCycle] before mount %c%s",
                    "color: green;",
                    app.name
                );
            },
        ],
        afterUnmount: [
            app => {
                console.log(
                    "[LifeCycle] after unmount %c%s",
                    "color: green;",
                    app.name
                );
            },
        ],
    });

    /**
     * @description 设置默认进入的子应用
     * @param {String} 需要进入的子应用路由前缀
     */
    setDefaultMountApp(defaultApp+"/");
    /**
     * @description 第一个应用构建完成后执行
     * @param 要执行的函数
     */
    runAfterFirstMounted(() => console.info("first app mounted"));

    /**
     * @description 启动微前端
     * @param prefetch 是否在第一次安装子应用程序后预取子应用程序的资产,默认为 true
     * @param jsSandbox 是否启用沙盒，当沙盒启用时，我们可以保证子应用程序是相互隔离的,默认为 true
     * @param singular 是否在一个运行时只显示一个子应用程序，这意味着子应用程序将等待挂载，直到卸载之前,默认为 true
     * @param fetch 设置一个fetch function,默认为 window.fetch
     */
    start({
        fetch: function (url, params) {
            // 忽略adguard（广告拦截文件）
            if (url.indexOf('.adguard.') > -1) {
                return new Promise(function (resolve) {
                    resolve({text: function () { return '';}});
                });
            }
            // params = params || {};
            // params.mode = 'no-cors';
            // params.headers = params.headers || {};
            // params.headers['Access-Control-Allow-Origin'] = '*';
            // params.headers['Content-Type'] = 'text/plain';
            return window.fetch(url, params);
        }
    });
    /**
     * @description 启动qiankun应用间通信机制
     */
    appStore(initGlobalState);
};

export default qianKunStart;
